<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<style>

</style>

<body>

</body>
<script>
    // function CreatePerson(name, age, sex) {
    //     this.name = name;
    //     this.age = age;
    //     this.sex = sex;
    //     this.sayHi = function() {
    //         return this.name + '-' + this.age + '-' + this.sex;
    //     }
    // }
    // var p1 = new CreatePerson('小明', '18', '男');
    // var p2 = new CreatePerson('小红', '9', '女');
    // console.log('p1.name = ' + p1.name);
    // console.log('p2.name = ' + p2.anme);
    // console.log('p1 = ' + p1.sayHi());
    // console.log('p2 = ' + p2.sayHi());
    // console.log(typeof p1)
    // console.log(typeof p2)
    // console.log(p2 instanceof Object);







    // function BicycleShop() {};
    // BicycleShop.prototype = {
    //     constructor: BicycleShop,
    //     bicycleCell(model) {
    //         var bicycle = this.createBicycle(model);
    //         bicycle.A();
    //         bicycle.B();
    //         return bicycle;
    //     },
    //     createBicycle: function() {
    //         throw new Error('父类是抽象类需要子类实例化调用！')
    //     }
    // }
    // var bicycle = new BicycleShop();
    // bicycle.bicycleCell('2131');




    // var BicycleShop = function(name) {
    //     this.name = name;
    //     this.method = function() {
    //         return this.name;
    //     }
    // }
    // BicycleShop.prototype = {
    //     constructor: BicycleShop,
    //     /*
    //      * 买自行车这个方法
    //      * @param {model} 自行车型号
    //      */
    //     sellBicycle: function(model) {
    //         var bicycle = this.createBicycle(model);
    //         // 执行A业务逻辑
    //         bicycle.A();

    //         // 执行B业务逻辑
    //         bicycle.B();

    //         return bicycle;
    //     },
    //     createBicycle: function(model) {
    //         throw new Error("父类是抽象类不能直接调用，需要子类重写该方法");
    //     }
    // };
    // // 实现原型继承
    // function extend(Sub, Sup) {
    //     // 首先定义一个空函数
    //     var F = function() {};
    //     // 设置空函数的原型为超类的原型
    //     F.prototype = Sup.prototype;
    //     // 实例化空函数，并把超类原型引用传递给子类
    //     Sub.prototype = new F();
    //     // 重置子类原型的构造器为子类自身
    //     Sub.prototype.constructor = Sub;
    //     // 在子类中保存超类的原型,避免子类与超类耦合
    //     Sub.sup = Sup.prototype;

    //     if (Sup.prototype.constructor === Object.prototype.constructor) {
    //         // 检测超类原型的构造器是否为原型自身
    //         Sup.prototype.constructor = Sup;
    //     }

    // }

    // var BicycleChild = function(name) {
    //         this.name = name;
    //         BicycleShop.call(this, name);

    //     }
    //     // 子类继承父类原型方法
    // extend(BicycleChild, BicycleShop);
    // // BicycleChild 子类重写父类的方法
    // BicycleChild.prototype.createBicycle = function(model) {
    //     var A = function() {
    //         console.log('执行A操作！');
    //     }
    //     var B = function() {
    //         console.log('执行B操作！');
    //     }
    //     return {
    //         A,
    //         B
    //     }
    // }
    // var bicycle = new BicycleChild('自行车');
    // bicycle.sellBicycle('zixong');





    // 学习单例模式 
    // 单例模式
    var Singleton = function(name) {
        this.name = name;

    }
    Singleton.prototype.getName = function() {
            return this.name;
        }
        // 获取实例对象
    var getInstance = (function() {
        var instance = null;
        return function(name) {
            if (!instance) {
                instance = new Singleton(name)
            }
            return instance;
        }
    }())

    // function getInstance(name) {
    //     var instance
    //     if (!this.instance) {
    //         this.instance = new Singleton(name);
    //     }
    //     return this.instance;
    // }
    var a = getInstance('aaaa');
    var b = getInstance('bbb');
</script>

</html>